#ifndef MANEJADOR_H_
#define MANEJADOR_H_

#include "hash/hashExtensible.h"
#include "hash/tipoClaveString.h"
#include "hash/tipoDatoInt.h"
#include "arbol/ArbolBMas.h"
#include "arbol/ClaveString.h"
#include "arbol/DatoInt.h"
#include "arbol/RegDatos.h"
#include "idxMasterfile/RegistroMF.h"
#include "idxMasterfile/IdxMasterfile.h"
#include "RTT/RTT.h"
#include "estadistica/Estadistica.h"

#include <string>

using namespace std;

/**
 * @class Controlador controlador.h "controlador.h"
 * @brief Clase que coordina y utiliza el hash/arbol/archivo maestro/etc
 */
class Controlador
{
	public:
		/**
		 * @brief Instancia el objeto y se fija que los archivos esten
		 * en caso de que no existan, los crea
		 */
		Controlador();
		
		/**
		 * @brief Se fija que los archivos esten y en caso de que no existan, los crea
		 */
		void abrirArchivos();
		
		/**
		 * @brief Dado un titulo, devuelve un vector de los matches
		 * @param titulo Titulo a buscar
		 * @param lista Lista donde se devolveran los registros hallados
		 */
		void buscarTitulo(string &titulo, vector<RegistroMF> &results);
		
		/**
		 * @brief Dado un autor, devuelve un vector de los matches
		 * @param autor Autor a buscar
		 * @param lista Lista donde se devolveran los registros hallados
		 */
		void buscarAutor(string &autor, vector<RegistroMF> &results);
		
		/**
		 * @brief Dada una frase, devuelve un vector de los matches
		 * @param frase Frase a buscar
		 * @param lista Lista donde se devolveran los registros hallados
		 */
		void buscarFrase(string &frase, vector<RegistroMF> &results);
		
		/**
		 * @brief Dado un archivo, lo agrega a la indexacion actual
		 * @param path Path al archivo
		 * @param result Registro resultante
		 * @return Si la operacion fue exitosa
		 */
		bool indexarArchivo(string &path, RegistroMF &result);
		
		/**
		 * @brief Dado un directorio, agrega todos los archivos a la indexacion actual
		 * @param path Path al directorio
		 * @param lista Lista donde se devolveran los registros que se indexaron
		 * @return Si la operacion fue exitosa
		 */
		bool indexarDirectorio(string &path, vector<RegistroMF> &results);

		void reindexar();

		bool cambiarDestino(string &path);

		~Controlador();

		string pathDir;


	private:
		/**
		 * @brief Se fija si un registro ya existia en la indexacion actual
		 * @details Descarta por autor, titulo e idioma
		 * @param reg Registro con los datos
		 * @return true si el registro ya estaba indexado
		 */
		bool estaIndexado(RegistroMF &reg);
		
		hashExtensible<TipoDatoInt,tipoClaveString> *hash;
		
		ArbolBMas<ClaveString,DatoInt> *arbol;
		
		IdxMasterfile *indexMF;
		
		RTT *rtt;


	public:
		Estadistica estadisticas;
};

#endif /* MANEJADOR_H_ */
